/* *
 * --ライセンスについて--
 *
 * 「本ファイルの内容は Mozilla Public License Version 1.1 (「本ライセンス」)
 * の適用を受けます。
 * 本ライセンスに従わない限り本ファイルを使用することはできません。
 * 本ライセンスのコピーは http://www.mozilla.org/MPL/ から入手できます。
 *
 * 本ライセンスに基づき配布されるソフトウェアは、「現状のまま」で配布されるものであり、
 * 明示的か黙示的かを問わず、いかなる種類の保証も行われません。
 * 本ライセンス上の権利および制限を定める具体的な文言は、本ライセンスを参照してください。
 *
 * オリジナルコードおよび初期開発者は、N_H (h.10x64@gmail.com) です。
 *
 * N_H によって作成された部分の著作権表示は次のとおりです。
 *
 * Copyright (C)N_H 2012
 *
 * このファイルの内容は、上記に代えて、
 * GNU General License version2 以降 (以下 GPL とする)、
 * GNU Lesser General Public License Version 2.1 以降 (以下 LGPL とする)、
 * の条件に従って使用することも可能です。
 * この場合、このファイルの使用には上記の条項ではなく GPL または LGPL の条項が適用されます。
 * このファイルの他者による使用を GPL または LGPL の条件によってのみ許可し、
 * MPL による使用を許可したくない対象者は、上記の条項を削除することでその意思を示し、
 * 上記条項を GPL または LGPL で義務付けられている告知およびその他の条項に置き換えてください。
 * 対象者が上記の条項を削除しない場合、
 * 受領者は MPL または GPL または LGPL ライセンスのいずれによってもこのファイルを
 * 使用することができます。」
 *
 * -- License --
 *
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License。You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND、either express or implied。See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Initial Developer of the Original Code is
 *   N_H (h.10x64@gmail.com).
 *
 * Portions created by the Initial Developer are Copyright (C)N_H 2012
 * the Initial Developer。All Rights Reserved.
 *
 * Alternatively、the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL")、or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above。If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL、and not to allow others to
 * use your version of this file under the terms of the MPL、indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL。If you do not delete
 * the provisions above、a recipient may use your version of this file under
 * the terms of any one of the MPL、the GPL or the LGPL.
 *
 * */
package com.magiciansforest.audio.soundrenderer.logic.mmd;

import java.io.IOException;
import projectkyoto.mmd.file.DataInputStreamLittleEndian;

/**
 *
 * @author N_H
 */
public class VMDCameraMotion {

    //Bezier Position X
    public static final int X_X0 = 0;
    public static final int X_X1 = 1;
    public static final int X_Y0 = 2;
    public static final int X_Y1 = 3;
    //Bezier Position Y
    public static final int Y_X0 = 4;
    public static final int Y_X1 = 5;
    public static final int Y_Y0 = 6;
    public static final int Y_Y1 = 7;
    //Bezier Position Z
    public static final int Z_X0 = 4;
    public static final int Z_X1 = 5;
    public static final int Z_Y0 = 6;
    public static final int Z_Y1 = 7;
    //Bezier Rotation
    public static final int ROT_X0 = 4;
    public static final int ROT_X1 = 5;
    public static final int ROT_Y0 = 6;
    public static final int ROT_Y1 = 7;
    //Bezier Distance
    public static final int DIST_X0 = 4;
    public static final int DIST_X1 = 5;
    public static final int DIST_Y0 = 6;
    public static final int DIST_Y1 = 7;
    //Bezier ViewAngle
    public static final int ANGL_X0 = 4;
    public static final int ANGL_X1 = 5;
    public static final int ANGL_Y0 = 6;
    public static final int ANGL_Y1 = 7;
    /* variables */
    private int frameNo;
    private float distance;
    private float posX, posY, posZ;
    private float rotX, rotY, rotZ;
    private byte[] bezier = new byte[24];
    private int viewAngle;
    private boolean parth;

    public VMDCameraMotion(DataInputStreamLittleEndian is) throws IOException {
        this.frameNo = is.readInt();
        this.distance = is.readFloat();
        this.posX = is.readFloat();
        this.posY = is.readFloat();
        this.posZ = is.readFloat();
        this.rotX = is.readFloat();
        this.rotY = is.readFloat();
        this.rotZ = is.readFloat();
        for (int i = 0; i < 24; i++) {
            bezier[i] = is.readByte();
        }
        viewAngle = is.readInt();
        parth = (is.readByte() == 0);
    }

    @Override
    public String toString() {
        String ret = "{";
        ret += "frameNo = " + frameNo + "\n";
        ret += "distance = " + distance + "\n";
        ret += "posX = " + posX + "\n";
        ret += "posY = " + posY + "\n";
        ret += "posZ = " + posZ + "\n";
        ret += "rotX = " + rotX + "\n";
        ret += "rotY = " + rotY + "\n";
        ret += "rotZ = " + rotZ + "\n";
        ret += "interpolation = {";
        for (int i = 0; i < bezier.length - 1; i++) {
            ret += bezier[i] + ", ";
        }
        ret += bezier[bezier.length - 1];
        ret += "}\n";
        ret += "viewAngle = " + viewAngle + "\n";
        ret += "parth = " + parth + "}";
        return ret;
    }

    public byte[] getBezier() {
        return bezier;
    }

    public float getDistance() {
        return distance;
    }

    public int getFrameNo() {
        return frameNo;
    }

    public boolean isParth() {
        return parth;
    }

    public float getPosX() {
        return posX;
    }

    public float getPosY() {
        return posY;
    }

    public float getPosZ() {
        return posZ;
    }

    public float getRotX() {
        return rotX;
    }

    public float getRotY() {
        return rotY;
    }

    public float getRotZ() {
        return rotZ;
    }

    public int getViewAngle() {
        return viewAngle;
    }

    public void setBezier(byte[] bezier) {
        this.bezier = bezier;
    }

    public void setDistance(float distance) {
        this.distance = distance;
    }

    public void setFrameNo(int frameNo) {
        this.frameNo = frameNo;
    }

    public void setParth(boolean parth) {
        this.parth = parth;
    }

    public void setPosX(float posX) {
        this.posX = posX;
    }

    public void setPosY(float posY) {
        this.posY = posY;
    }

    public void setPosZ(float posZ) {
        this.posZ = posZ;
    }

    public void setRotX(float rotX) {
        this.rotX = rotX;
    }

    public void setRotY(float rotY) {
        this.rotY = rotY;
    }

    public void setRotZ(float rotZ) {
        this.rotZ = rotZ;
    }

    public void setViewAngle(int viewAngle) {
        this.viewAngle = viewAngle;
    }
}
